
package nadesicoi;

import groovy.net.xmlrpc.*
import java.net.ServerSocket
import groovy.swing.SwingBuilder
import java.sql.*;
import java.util.*;
import groovy.sql.*;
import groovy.inspect.swingui.*


import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 * //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 * //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 *
 * @author Usuario
 */
public class Main {

    static def config = new Config()
    static def conexs = [:]
    static def consola
    static def spring
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
              SwingBuilder.build { lookAndFeel('nimbus') }
              consola = Consola.lanzar()

            while(true){
                  try{
                      def db       = Sql.newInstance("jdbc:mysql://localhost/omoikane?user=root&password=", "root", "", "com.mysql.jdbc.Driver")
                      db.close()
                      break
                  }catch(e){Consola.aviso "Esperando MySQL......";Thread.sleep(10000)}
              }
              def factory = new ClassPathXmlApplicationContext("nadesicoi/applicationContext.xml")
              spring      = factory
              Consola.aviso "GORM inicializado!"

              def driver   = "com.mysql.jdbc.Driver";
              Class.forName(driver).newInstance();

              def server   = new XMLRPCServer()
              server.echo  = {return it}
              server.login = { def uid = Util.generarUID().toString(); conexs[uid]=[:]; uid }
              server.logout= { uid -> conexs.remove(uid); return true }
              ArticulosFunciones.asignarA       server
              LineasFunciones.asignarA          server
              LineasDualesFunciones.asignarA    server
              Grupos.asignarA                   server
              Db.asignarA                       server
              Caja.asignarA                     server
              Almacenes.asignarA                server
              Ventas.asignarA                   server
              Facturas.asignarA                 server
              Usuarios.asignarA                 server
              ClientesFunciones.asignarA        server
              Cortes.asignarA                   server
              CorteDual.asignarA                server
              Sucursales.asignarA               server
              StatusQ.asignarA                  server
              PuertoNadesico.asignarA           server

            //groovy.inspect.swingui.ObjectBrowser.inspect Articul

                //println Lineas.get(1).dump()
                //def artic = Articulos.get(145570)
                //artic.addToCodigos(new CodigosArticulo(codigo:'elOtroCodigo')).save()
                //println Articulos.get(145570).dump()
                /*println Articulos.get(145570).codigos.each() {
                    println it.dump()
                }*/
                
                //Articulos.withTransaction {
                    //def art = new Articulos(descripcion:"último objeto2")
                    //art.addToCodigos(new CodigosArticulo(codigo:"uObj")).save()
                    //art.addToLinea(new Lineas(descripcion:"uObj")).save()
                    //println art.save(flush:true)
                    //(new Articulos(descripcion:"último objeto5", linea:Lineas.get(1))).save()
                    //(new Articulos(descripcion:"último objeto8")).addToCodigos(new CodigosArticulo(codigo:"lalalauiiuiui")).save()
                //}
                
                //println Articulos.get(145570).linea.dump()
                //println CodigosArticulo.get(1).dump()
            //}
            
            def sf = factory.getBean("sessionFactory")
            /*
            

            def sess = sf.openSession()
            def tx = sess.beginTransaction()
            //sess.createQuery("delete Contact").executeUpdate()
            //sess.save new Articulos(descripcion:"último objeto3", linea:Lineas.get(1))
            //sess.save new Hoja(alfa: 'Dan Allen', beta: 'dallen@example.com')
            tx.commit()
            sess.close()
            sf.close()
            */
            def stats = sf.getStatistics()
            stats.setStatisticsEnabled(true)
            def serverSocket = new ServerSocket(5542)      // Open a server socket on a free port
            server.startServer(serverSocket)
            Consola.aviso "Servidor funcionando en puerto 5542"
            Consola.estatus "<html><font color=blue>Activo</fotn></html>"

            tareasProgramadas()
            cacheArticulos()

        } catch(e) { Consola.error("Error al iniciar servicio", e) }
    }

    static def cacheArticulos() {
            if(Boolean.valueOf(Main.config.cacheArticulos[0].text())) {
                Consola.aviso "Cargando caché de artículos"
                def cacheData = CacheArticulos.generar()
                Consola.aviso "Caché generado en ${cacheData[0]} milisegundos", cacheData[1]
            } else {
                Consola.aviso "Caché de artículos inactivo"
            }
    }
    static def tareasProgramadas() {
            if(Boolean.valueOf(Main.config.lanzadorTareas[0].text())) {
                Consola.aviso "Lanzador de tareas programadas ejecutandose..."
                def ini = System.currentTimeMillis()
                (new TareasProgramadas()).start()
                Consola.aviso "Lanzador de tareas completado en ${System.currentTimeMillis() - ini} milisegundos"
            } else {
                Consola.aviso "Lanzador de tareas inactivo"
            }

    }
}
